package com.firefly.admin.tripartite.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.firefly.admin.common.constant.Constants;
import com.firefly.admin.common.enums.ResultCodeEnum;
import com.firefly.admin.common.exception.BusinessException;
import com.firefly.admin.common.vo.Result;
import com.firefly.admin.tripartite.entity.FyTripartiteWechatMerchant;
import com.firefly.admin.tripartite.mapper.FyTripartiteWechatMerchantMapper;
import com.firefly.admin.tripartite.service.FyTripartiteWechatMerchantService;
import com.firefly.admin.tripartite.vo.WechatMerchantQueryVo;
import com.firefly.admin.tripartite.vo.WechatMerchantStatusUpdateVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.List;

@Service
@Slf4j
public class FyTripartiteWechatMerchantServiceImpl implements FyTripartiteWechatMerchantService {

    @Autowired
    private FyTripartiteWechatMerchantMapper fyTripartiteWechatMerchantMapper;

    /**
     * 通过appId获取商户配置
     *
     * @param appId 小程序appId
     * @return 微信商户配置
     */
    @Override
    public FyTripartiteWechatMerchant findByAppId(String appId) {
        List<FyTripartiteWechatMerchant> wechatMerchantConfigList = fyTripartiteWechatMerchantMapper.findByAppId(appId);
        if (CollectionUtils.isEmpty(wechatMerchantConfigList)) {
            throw new BusinessException("微信商户配置不存在");
        }
        return wechatMerchantConfigList.get(0);
    }

    /**
     * 通过微信商户序列号查询微信商户信息
     *
     * @param merchantSerialNumber 微信商户序列号
     * @return 微信商户信息
     */
    @Override
    public FyTripartiteWechatMerchant findByMerchantSerialNumber(String merchantSerialNumber) {
        LambdaQueryWrapper<FyTripartiteWechatMerchant> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(FyTripartiteWechatMerchant::getMerchantSerialNumber, merchantSerialNumber);
        queryWrapper.eq(FyTripartiteWechatMerchant::getMerchantStatus, Constants.Status.ENABLE);
        List<FyTripartiteWechatMerchant> wechatMerchantConfigList = fyTripartiteWechatMerchantMapper.selectList(queryWrapper);
        if (CollectionUtils.isEmpty(wechatMerchantConfigList)) {
            throw new BusinessException("微信商户配置不存在");
        }
        return wechatMerchantConfigList.get(0);
    }

    /**
     * 分页查询第三方微信商户接口
     *
     * @param wechatMerchantQueryVo 分页查询参数
     * @return 分页列表
     */
    @Override
    public Result<Page<FyTripartiteWechatMerchant>> getWechatMerchantList(WechatMerchantQueryVo wechatMerchantQueryVo) {
        log.info("###########FyTripartiteWechatMerchantServiceImpl getWechatMerchantList param = {}", JSONObject.toJSONString(wechatMerchantQueryVo));
        LambdaQueryWrapper<FyTripartiteWechatMerchant> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(StringUtils.isNotBlank(wechatMerchantQueryVo.getMerchantName()), FyTripartiteWechatMerchant::getMerchantName, wechatMerchantQueryVo.getMerchantName());
        queryWrapper.eq(StringUtils.isNotBlank(wechatMerchantQueryVo.getMerchantStatus()), FyTripartiteWechatMerchant::getMerchantStatus, wechatMerchantQueryVo.getMerchantStatus());
        queryWrapper.eq(FyTripartiteWechatMerchant::getDeleteFlag, Constants.DeleteFlag.NORMAL);
        queryWrapper.orderByDesc(FyTripartiteWechatMerchant::getCreateTime);
        Page<FyTripartiteWechatMerchant> page = new Page<>(wechatMerchantQueryVo.getPage(), wechatMerchantQueryVo.getLimit());
        Page<FyTripartiteWechatMerchant> wechatMerchantPage = fyTripartiteWechatMerchantMapper.selectPage(page, queryWrapper);
        return Result.success(wechatMerchantPage);
    }

    /**
     * 第三方微信商户信息新增接口
     *
     * @param fyTripartiteWechatMerchant 微信商户信息
     * @return 操作结果
     */
    @Override
    public Result<FyTripartiteWechatMerchant> add(FyTripartiteWechatMerchant fyTripartiteWechatMerchant) {
        if (fyTripartiteWechatMerchant == null) {
            return Result.getResult(ResultCodeEnum.REQUEST_PARAM_EXCEPTION);
        }
        ResultCodeEnum resultCodeEnum = checkWechatMerchantParam(fyTripartiteWechatMerchant);
        if (resultCodeEnum != null) {
            return Result.getResult(resultCodeEnum);
        }
        int rows = fyTripartiteWechatMerchantMapper.insert(fyTripartiteWechatMerchant);
        if (rows <= 0) {
            return Result.getResult(ResultCodeEnum.ADD_EXCEPTION);
        }
        return Result.success(fyTripartiteWechatMerchant);
    }

    /**
     * 第三方微信商户信息编辑接口
     *
     * @param fyTripartiteWechatMerchant 微信商户信息
     * @return 操作结果
     */
    @Override
    public Result<FyTripartiteWechatMerchant> update(FyTripartiteWechatMerchant fyTripartiteWechatMerchant) {
        if (fyTripartiteWechatMerchant == null) {
            return Result.getResult(ResultCodeEnum.REQUEST_PARAM_EXCEPTION);
        }
        Long merchantConfigId = fyTripartiteWechatMerchant.getMerchantConfigId();
        if (merchantConfigId == null) {
            return Result.getResult(ResultCodeEnum.REQUEST_PARAM_EXCEPTION);
        }
        FyTripartiteWechatMerchant wechatMerchant = fyTripartiteWechatMerchantMapper.selectById(merchantConfigId);
        if (wechatMerchant == null) {
            return Result.getResult(ResultCodeEnum.TRIPARTITE_WECHAT_APPLET_NOT_FOUND);
        }
        ResultCodeEnum resultCodeEnum = checkWechatMerchantParam(fyTripartiteWechatMerchant);
        if (resultCodeEnum != null) {
            return Result.getResult(resultCodeEnum);
        }
        int rows = fyTripartiteWechatMerchantMapper.updateById(fyTripartiteWechatMerchant);
        if (rows <= 0) {
            return Result.getResult(ResultCodeEnum.UPDATE_EXCEPTION);
        }
        return Result.success(fyTripartiteWechatMerchant);
    }

    /**
     * 第三方微信商户状态编辑接口
     *
     * @param wechatMerchantStatusUpdateVo 状态信息
     * @return 操作结果
     */
    @Override
    public Result<FyTripartiteWechatMerchant> updateStatus(WechatMerchantStatusUpdateVo wechatMerchantStatusUpdateVo) {
        if (wechatMerchantStatusUpdateVo == null) {
            return Result.getResult(ResultCodeEnum.REQUEST_PARAM_EXCEPTION);
        }
        Long merchantConfigId = wechatMerchantStatusUpdateVo.getMerchantConfigId();
        if (merchantConfigId == null) {
            return Result.getResult(ResultCodeEnum.REQUEST_PARAM_EXCEPTION);
        }
        FyTripartiteWechatMerchant fyTripartiteWechatMerchant = fyTripartiteWechatMerchantMapper.selectById(merchantConfigId);
        if (fyTripartiteWechatMerchant == null) {
            return Result.getResult(ResultCodeEnum.TRIPARTITE_WECHAT_MERCHANT_NOT_FOUND);
        }
        String merchantStatus = wechatMerchantStatusUpdateVo.getMerchantStatus();
        if (StringUtils.isBlank(merchantStatus)) {
            return Result.getResult(ResultCodeEnum.TRIPARTITE_WECHAT_MERCHANT_STATUS_NOT_NULL);
        }
        fyTripartiteWechatMerchant.setMerchantStatus(merchantStatus);
        int rows = fyTripartiteWechatMerchantMapper.updateById(fyTripartiteWechatMerchant);
        if (rows <= 0) {
            return Result.getResult(ResultCodeEnum.UPDATE_EXCEPTION);
        }
        return Result.success(fyTripartiteWechatMerchant);
    }

    /**
     * 第三方微信商户信息删除接口
     *
     * @param merchantConfigId 微信商户ID
     * @return 操作结果
     */
    @Override
    public Result<String> delete(Long merchantConfigId) {
        if (merchantConfigId == null) {
            return Result.getResult(ResultCodeEnum.REQUEST_PARAM_EXCEPTION);
        }
        FyTripartiteWechatMerchant fyTripartiteWechatMerchant = fyTripartiteWechatMerchantMapper.selectById(merchantConfigId);
        if (fyTripartiteWechatMerchant == null) {
            return Result.getResult(ResultCodeEnum.TRIPARTITE_WECHAT_MERCHANT_NOT_FOUND);
        }
        fyTripartiteWechatMerchant.setDeleteFlag(Constants.DeleteFlag.DELETE);
        int rows = fyTripartiteWechatMerchantMapper.updateById(fyTripartiteWechatMerchant);
        if (rows <= 0) {
            return Result.getResult(ResultCodeEnum.DELETE_EXCEPTION);
        }
        return Result.success();
    }

    /**
     * 第三方微信商户号校验接口
     *
     * @param merchantId       微信商户号
     * @param merchantConfigId 微信商户配置ID
     * @return 校验结果
     */
    @Override
    public Result<String> merchantIdCheck(String merchantId, Long merchantConfigId) {
        if (StringUtils.isBlank(merchantId)) {
            return Result.getResult(ResultCodeEnum.REQUEST_PARAM_EXCEPTION);
        }
        boolean isExistMerchantId = isExistMerchantId(merchantId, merchantConfigId);
        if (isExistMerchantId) {
            return Result.success(ResultCodeEnum.TRIPARTITE_WECHAT_MERCHANT_ID_EXIST.getMsg());
        }
        return Result.success();
    }

    /**
     * 根据商户配置ID查询商户信息
     *
     * @param merchantConfigId 商户配置ID
     * @return 商户信息
     */
    @Override
    public FyTripartiteWechatMerchant findById(Long merchantConfigId) {
        return fyTripartiteWechatMerchantMapper.selectById(merchantConfigId);
    }

    /**
     * 查询可用的第三方微信商户接口
     *
     * @return 微信商户列表
     */
    @Override
    public Result<List<FyTripartiteWechatMerchant>> getUsableWechatMerchantList() {
        LambdaQueryWrapper<FyTripartiteWechatMerchant> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(FyTripartiteWechatMerchant::getMerchantStatus, Constants.Status.ENABLE);
        queryWrapper.eq(FyTripartiteWechatMerchant::getDeleteFlag, Constants.DeleteFlag.NORMAL);
        List<FyTripartiteWechatMerchant> wechatMerchantList = fyTripartiteWechatMerchantMapper.selectList(queryWrapper);
        return Result.success(wechatMerchantList);
    }

    public ResultCodeEnum checkWechatMerchantParam(FyTripartiteWechatMerchant fyTripartiteWechatMerchant) {
        Long merchantConfigId = fyTripartiteWechatMerchant.getMerchantConfigId();
        String merchantName = fyTripartiteWechatMerchant.getMerchantName();
        if (StringUtils.isBlank(merchantName)) {
            return ResultCodeEnum.TRIPARTITE_WECHAT_MERCHANT_NAME_NOT_NULL;
        }
        String merchantId = fyTripartiteWechatMerchant.getMerchantId();
        if (StringUtils.isBlank(merchantId)) {
            return ResultCodeEnum.TRIPARTITE_WECHAT_MERCHANT_ID_NOT_NULL;
        }
        boolean isExistMerchantId = isExistMerchantId(merchantId, merchantConfigId);
        if (isExistMerchantId) {
            return ResultCodeEnum.TRIPARTITE_WECHAT_MERCHANT_ID_EXIST;
        }
        String merchantKey = fyTripartiteWechatMerchant.getMerchantKey();
        if (StringUtils.isBlank(merchantKey)) {
            return ResultCodeEnum.TRIPARTITE_WECHAT_MERCHANT_KEY_NOT_NULL;
        }
        String merchantSerialNumber = fyTripartiteWechatMerchant.getMerchantSerialNumber();
        if (StringUtils.isBlank(merchantSerialNumber)) {
            return ResultCodeEnum.TRIPARTITE_WECHAT_MERCHANT_SERIAL_NUMBER_NOT_NULL;
        }
        String apiV3Key = fyTripartiteWechatMerchant.getApiV3Key();
        if (StringUtils.isBlank(apiV3Key)) {
            return ResultCodeEnum.TRIPARTITE_WECHAT_MERCHANT_API_KEY_NOT_NULL;
        }
        return null;
    }

    /**
     * 校验微信商户号是否存在
     *
     * @param merchantId       微信商户号
     * @param merchantConfigId 微信商户配置ID
     * @return true: 存在   false:不存在
     */
    public boolean isExistMerchantId(String merchantId, Long merchantConfigId) {
        LambdaQueryWrapper<FyTripartiteWechatMerchant> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(FyTripartiteWechatMerchant::getMerchantId, merchantId);
        queryWrapper.eq(FyTripartiteWechatMerchant::getDeleteFlag, Constants.DeleteFlag.NORMAL);
        List<FyTripartiteWechatMerchant> wechatMerchantList = fyTripartiteWechatMerchantMapper.selectList(queryWrapper);
        if (!CollectionUtils.isEmpty(wechatMerchantList)) {
            if (merchantConfigId == null) {
                //新增
                return true;
            } else {
                //编辑
                for (FyTripartiteWechatMerchant wechatMerchant : wechatMerchantList) {
                    if (merchantConfigId.longValue() != wechatMerchant.getMerchantConfigId().longValue()) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
}
